package Day05;

/**
 * ------------------------------------------------------------------------------------------
 * 题目：
 *      给你一个整数数组 nums 和一个整数 k ，请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。
 * ------------------------------------------------------------------------------------------
 * 示例：
 *      输入：nums = [10,5,2,6], k = 100
 *      输出：8
 *      解释：8 个乘积小于 100 的子数组分别为：[10]、[5]、[2],、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。
 *          需要注意的是 [10,5,2] 并不是乘积小于 100 的子数组。
 * ------------------------------------------------------------------------------------------
 * 方法：
 *      滑动窗口
 *      先向后*=nums[j]，如果count的值大于k，那么/=前面的nums[i]
 * ------------------------------------------------------------------------------------------
 */
class Solution {
    public static void main(String[] args) {
        int[] nums = new int[]{10,5,2,6};
        int k = 100;
        System.out.println(numSubarrayProductLessThanK(nums,k));
    }
    public static int numSubarrayProductLessThanK(int[] nums, int k) {
        int n = nums.length;
        int i=0;
        int ans=0;
        int count=1;
        for(int j=0;j<n;++j){
            count*=nums[j];
            while(j>=i&&count>=k){
                count/=nums[i];
                ++i;
            }
            ans+=j-i+1;
        }
        return ans;
    }
}